// 一，请说出下列代码最终的执行结果，并解释为什么
// var a = []
// for (var i = 0; i < 10; i++) {
//   a[i] = function () {
//     console.log(i)
//   }
// }
// a[6]()
/**
 * 答：在VO执行栈中存在变量a和变量i，每一次for循环都为a数组i下标赋值一个fun，
 * fun里面引用了i变量，在fun AO执行栈里边，没有找到i，所以往上继续找，
 * 找到VO 执行栈的i，当函数调用时，i已经++到10了
 */

// 二，请说出下列代码最终的执行结果，并解释为什么
// var tmp = 123
// if (true) {
//   console.log(tem)
//   let tmp
// }
/**
 * 答：会报错，初始化前无法访问tmp
 * 在es6，代码块{}有了局部作用域，if语句里边有let声明，
 * 会出现暂时性死区，也就是在声明前不允许访问
 */

// 三，结合ES6新语法，用最简单的方式找出最小的值
// var arr = [12, 34, 32, 89, 4]
// Math.min(...arr)

// 四、请详细说明var、let、const三种声明变量方式之间的区别
/**
 * 答：var是es5的变量声明方式，如果不是在函数体内声明，默认声明全局作用域变量，而且会存在变量提升，
 * 也就是可以在变量会出现在代码顶部，在变量声明前访问变量不会报错，返回undefined
 * let和const是ES6新出的变量声明，不存在变量提升，在变量声明前访问变量会报错，也就是暂时性死区，于let不同的是，
 * const声明还有一个只读的特性，就是只能赋值一次，如果二次赋值会报错
 */

// 五，请说出下列代码最终的执行结果，并解释为什么
// var a = 10
// var obj = {
//   a: 20,
//   fn(){
//     setTimeout(() => {
//       console.log(this.a);
//     });
//   }
// }
// obj.fn()
/**
 * 答：20
 * 因为箭头函数不会改变this的指向，而箭头函数的this指向当前作用域的this
 * 所以this.a指向的是obj.fn的this.a
 */

// 六，请简述Symbol类型的用途
